// 导入封装的本地持久化方法
// import * as auth from '@/utils/auth.js'
import * as auth from '@/utils/auth.js'

import { getUserInfo, login, getUserDetailById } from '@/api/user'

import { resetRouter } from '@/router/index.js'

export default {
  namespaced: true,
  // ================================= 存储数据 =================================
  state: {
    token: auth.getToken() || null,
    userInfo: {}
  },
  // ================================= 修改数据 =================================
  mutations: {
    /**
     * @param {*} state 数据对象
     * @param {*} token 外部调用传入的参数
     */
    // 修改token
    setToken (state, token) {
      state.token = token
      auth.setToken(token)
    },
    // 删除token
    delToken (state, token) {
      state.token = null
      auth.removeToken()
    },
    // 修改登录人信息
    setUserInfo (state, userInfo) {
      state.userInfo = userInfo
    },
    // 删除登录人信息
    delUserInfo (state) {
      state.userInfo = {}
    }
  },
  // ================================= 异步方法 =================================
  actions: {

    // --------------------------------退出登录----------------------------------
    logout ({ commit }) {
      /**
       1．后台退出＝》调用接口
       2．前端退出＝》清除本地数据
       3．重置路由（动态追加路由的缓存）
       4．清除routes模块中菜单数据，只留下静态路由
       */
      commit('delToken')
      commit('delUserInfo')
      resetRouter()
      commit('routes/setMenuList', [], { root: true })
    },

    // ----------------------------------登录--------------------------------------
    async loginAction ({ commit }, formData) {
      /**
       * context:{
       *   state,       等同于store.$state, 若在模块中则为局部状态
       *   rootState,   等同于store.$state, 只存在模块中
       *   commit,      等同于store.$commit
       *   dispatch,    等同于store.$dispatch
       *   getters      等同于store.$getters
       * }
       * action的函数可以接收一个与store实例具有相同方法的属性context
       * 常规写法调用的时候会使用context.commit，
       * 但更多的是使用es6的变量解构赋值，也就是直接在参数的位置写自己想要的属性，如：{commit}。
       *
       * @param {*} context:{commit:调用mutations方法}
       * @param {*} formData 外界调用传入的参数(手机号,密码)
       */
      // console.log('context输出: ', context)
      const token = await login(formData)
      // console.log('登陆了!', token)
      commit('setToken', token)
    },

    // -------------------------------获取登录人信息---------------------------------
    async getUserInfo ({ commit }) {
      // console.log('context输出: ', context)
      const userInfo = await getUserInfo()
      const userDetail = await getUserDetailById(userInfo.userId)
      // console.log('登陆了!', token)
      commit('setUserInfo', { ...userInfo, ...userDetail })
      return userInfo.roles
    }
  }
}
